package in.lib.adapter; import in.lib.Constants; import in.lib.adapter.base.MessageAdapter; import in.lib.handler.PostStarResponseHandler; import in.lib.handler.PostUnStarResponseHandler; import in.lib.helper.ThemeHelper; import in.lib.holder.CenterPostHolder; import in.lib.holder.PostHolder; import in.lib.manager.APIManager; import in.lib.manager.SettingsManager; import in.lib.manager.UserManager; import in.model.Post; import in.model.SimpleUser; import in.model.base.NetObject; import in.obj.annotation.Annotation; import in.obj.annotation.Annotation.Type; import in.obj.annotation.LinkAnnotation; import in.rob.client.ProfileActivity; import in.rob.client.R; import in.rob.client.dialog.DeletePostDialog; import in.rob.client.dialog.PostDetailsDialog; import in.rob.client.dialog.RepostDialog; import in.rob.client.dialog.base.DialogBuilder; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import lombok.Getter; import lombok.Setter; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.net.Uri; import android.text.Html; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; public class PostAdapter extends MessageAdapter<Post> { @Getter @Setter private boolean ready = true; @Getter private final int postLayoutResource, mentionLayoutResource, centerPostLayoutResource, hiddenPostLayoutResource; public PostAdapter(Context context, List<Post> items, Post centralPost) { this(context, items, centralPost, Order.DESC); } public PostAdapter(Context context, List<Post> items) { this(context, items, null, Order.DESC); } public PostAdapter(Context context, List<Post> items, Post centralPost, Order order) { super(context, items); this.postLayoutResource = R.layout.post_list_item; this.mentionLayoutResource = R.layout.post_list_item_mention; this.centerPostLayoutResource = R.layout.post_list_item_center; this.hiddenPostLayoutResource = R.layout.post_list_item_hidden; } @Override public View getView(int position, View convertView, ViewGroup parent) { int viewType = getItemViewType(position); Post post = (Post)getItem(position); PostHolder currentHolder; if (convertView == null) { if (viewType == TYPE_STANDARD) { convertView = getLayoutInflater().inflate(this.postLayoutResource, parent, false); } else if (viewType == TYPE_MENTION) { convertView = getLayoutInflater().inflate(this.mentionLayoutResource, parent, false); } else if (viewType == TYPE_CENTER) { convertView = getLayoutInflater().inflate(this.centerPostLayoutResource, parent, false); } else if (viewType == TYPE_HIDDEN) { convertView = getLayoutInflater().inflate(this.hiddenPostLayoutResource, parent, false); } if (viewType == TYPE_CENTER) { currentHolder = new CenterPostHolder(convertView); ((CenterPostHolder)currentHolder).userContainer.setOnClickListener(this); } else { currentHolder = new PostHolder(convertView); } convertView.setTag(R.id.TAG_VIEW_HOLDER, currentHolder); convertView.setTag(R.id.TAG_POST_HIDDEN, viewType == TYPE_HIDDEN); // set the button listeners for options currentHolder.replyButton.setOnClickListener(this); currentHolder.replyAllButton.setOnClickListener(this); currentHolder.starButton.setOnClickListener(this); currentHolder.shareButton.setOnClickListener(this); currentHolder.moreButton.setOnClickListener(this); currentHolder.repostButton.setOnClickListener(this); currentHolder.avatar.setOnClickListener(this); currentHolder.avatar.setOnLongClickListener(this); if (convertView.findViewById(R.id.missing_posts) != null) { convertView.findViewById(R.id.missing_posts).setOnClickListener(this); } } else { currentHolder = (PostHolder)convertView.getTag(R.id.TAG_VIEW_HOLDER); } // set defaults currentHolder.repostButton.setVisibility(View.VISIBLE); currentHolder.replyAllButton.setVisibility(View.VISIBLE); currentHolder.optionsContainer.setVisibility(View.GONE); if (viewType == TYPE_CENTER) { ((CenterPostHolder)currentHolder).populate(post, this, true); ((CenterPostHolder)currentHolder).locationImage.setTag(position); ((CenterPostHolder)currentHolder).locationImage.setOnClickListener(this); currentHolder.crosspost.setTag(position); currentHolder.crosspost.setOnClickListener(this); currentHolder.text.setTag(R.id.TAG_ENTITY, post.getAnnotations()); currentHolder.media.setOnClickListener(this); currentHolder.media.setOnLongClickListener(this); currentHolder.media.setTag(position); ((CenterPostHolder)currentHolder).userContainer.setTag(position); } else if (viewType == TYPE_STANDARD || viewType == TYPE_MENTION) { currentHolder.populate(post, this, getCenter() != null); currentHolder.media.setOnClickListener(this); currentHolder.media.setOnLongClickListener(this); currentHolder.media.setTag(position); if (position == getBreakPosition()) { currentHolder.missingPosts.setTag(position); currentHolder.missingPosts.setVisibility(View.VISIBLE); convertView.findViewById(R.id.divider).setVisibility(View.GONE); if (getResetBreak()) { currentHolder.missingPosts.setTag(R.id.TAG_IS_LOADING, null); currentHolder.missingPosts.setTag(R.id.TAG_POST_POSITION, null); setResetBreak(false); } if ((currentHolder.missingPosts.getTag(R.id.TAG_IS_LOADING) != null && (Integer)currentHolder.missingPosts.getTag(R.id.TAG_POST_POSITION) == (Integer)currentHolder.missingPosts.getTag())) { currentHolder.missingPosts.findViewById(R.id.load_text).setVisibility(View.GONE); currentHolder.missingPosts.findViewById(R.id.progress).setVisibility(View.VISIBLE); } else { currentHolder.missingPosts.findViewById(R.id.load_text).setVisibility(View.VISIBLE); currentHolder.missingPosts.findViewById(R.id.progress).setVisibility(View.GONE); } } else { currentHolder.missingPosts.setVisibility(View.GONE); convertView.findViewById(R.id.divider).setVisibility(View.VISIBLE); } if (position == getBreakPosition() + 1) { currentHolder.missingPostsTop.setVisibility(View.VISIBLE); } else { currentHolder.missingPostsTop.setVisibility(View.GONE); } } else if (viewType == TYPE_HIDDEN) { return convertView; } currentHolder.avatar.setTag(position); currentHolder.moreButton.setTag(position); currentHolder.replyButton.setTag(position); currentHolder.replyAllButton.setTag(position); currentHolder.starButton.setTag(position); currentHolder.shareButton.setTag(position); currentHolder.repostButton.setTag(position); super.getView(position, convertView, parent); return convertView; } /** * Gets an item from it's ID * @param id the ID to search for * @return The object, or null */ public NetObject getItemByOriginalId(String id) { for (NetObject obj : getStream().getObjects()) { if (((Post)obj).getOriginalId().equals(id)) { return obj; } } return null; } @Override public void onClick(final View v) { super.onClick(v); if (v.getTag() == null) return; final Post post = (Post)getItem((Integer)v.getTag()); if (v.getId() == R.id.missing_posts && v.getTag(R.id.TAG_IS_LOADING) == null) { if (onPagerListener != null) { Post loadFrom = (Post)getItem((Integer)v.getTag() + 1); v.setTag(R.id.TAG_IS_LOADING, true); v.setTag(R.id.TAG_POST_POSITION, v.getTag()); v.findViewById(R.id.load_text).setVisibility(View.GONE); v.findViewById(R.id.progress).setVisibility(View.VISIBLE); onPagerListener.onBreakClicked(loadFrom); } } if (v.getId() == R.id.more) { final LinkedHashMap<Integer, String> options = new LinkedHashMap<Integer, String>(); options.put(2, getContext().getString(R.string.details)); if (post.getAnnotations() != null && post.getAnnotations().containsKey(Type.LINK) && post.getAnnotations().get(Type.LINK).size() > 0) { options.put(1, getContext().getString(R.string.links)); } if (post.getRepostCount() > 0) { options.put(5, getContext().getString(R.string.show_reposters)); } if (post.getStarCount() > 0) { options.put(9, getContext().getString(R.string.show_starred_by)); } options.put(6, getContext().getString(R.string.copy_text)); options.put(8, getContext().getString(R.string.translate_post)); if (SettingsManager.isThreadMuted(post.getThreadId())) { options.put(4, getContext().getString(R.string.unmute_thread)); } else { options.put(4, getContext().getString(R.string.mute_thread)); } List<String> ids = UserManager.getLinkedUserIds(getContext()); if (ids.contains(post.getPoster().getId())) { options.put(3, getContext().getString(R.string.delete)); } if (!post.getPoster().isYou()) { options.put(7, getContext().getString(R.string.report)); } CharSequence[] items = options.values().toArray(new CharSequence[options.size()]); DialogBuilder.create(getContext()) .setIcon(ThemeHelper.getDrawableResource(getContext(), R.attr.rbn_dialog_icon_misc)) .setTitle(R.string.pick_option) .setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Integer[] keyset = options.keySet().toArray(new Integer[options.size()]); if (keyset[which] == 1) { List<Annotation> entities = post.getAnnotations().get(Annotation.Type.LINK); final CharSequence[] keys = new CharSequence[entities.size()]; final CharSequence[] links = new CharSequence[entities.size()]; for (int index = 0; index < links.length; index++) { keys[index] = ((LinkAnnotation)entities.get(index)).getUrl(); links[index] = ((LinkAnnotation)entities.get(index)).getUrl(); } if (links.length > 1) { DialogBuilder.create(getContext()) .setTitle(getContext().getString(R.string.select_link)) .setItems(keys, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setData(Uri.parse(links[which].toString())); getContext().startActivity(browserIntent); dialog.dismiss(); } }).show(); } else { Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setData(Uri.parse(links[0].toString())); getContext().startActivity(browserIntent); } } else if (keyset[which] == 2) { Intent inReply = new Intent(getContext(), PostDetailsDialog.class); inReply.putExtra(Constants.EXTRA_POST, post); getContext().startActivity(inReply); } else if (keyset[which] == 3) { Intent inDelete = new Intent(getContext(), DeletePostDialog.class); inDelete.putExtra(Constants.EXTRA_POST, post); getContext().startActivity(inDelete); } else if (keyset[which] == 4) { if (SettingsManager.isThreadMuted(post.getThreadId())) { SettingsManager.getInstance(getContext()).unmuteThread(post.getThreadId()); } else { SettingsManager.getInstance(getContext()).muteThread(post.getThreadId()); } } else if (keyset[which] == 5) { showReposters(post); } else if (keyset[which] == 6) { String originalText = Html.fromHtml(post.getFormattedText()).toString(); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(originalText); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", originalText); clipboard.setPrimaryClip(clip); } Toast.makeText(getContext(), getContext().getString(R.string.copy_text_success), Toast.LENGTH_SHORT).show(); } else if (keyset[which] == 7) { DialogBuilder.create(getContext()) .setTitle(R.string.confirm) .setMessage(R.string.confirm_report) .setPositiveButton(R.string.yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { APIManager.getInstance().report(post.getId(), null); Toast.makeText(getContext(), getContext().getString(R.string.post_reported), Toast.LENGTH_LONG).show(); } }) .setNegativeButton(R.string.no, null) .show(); } else if (keyset[which] == 8) { String originalText = Html.fromHtml(post.getFormattedText()).toString(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://translate.google.com/?q=" + Uri.encode(originalText))); getContext().startActivity(intent); } else if (keyset[which] == 9) { showStarredBy(post); } dialog.dismiss(); } }) .show(); } else if (v.getId() == R.id.crosspost) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(post.getCrossPostUrl())); getContext().startActivity(intent); } else if (v.getId() == R.id.repost) { Intent inRepost = new Intent(getContext(), RepostDialog.class); inRepost.putExtra(Constants.EXTRA_REPOST, post); getContext().startActivity(inRepost); } else if (v.getId() == R.id.star) { APIManager manager = APIManager.getInstance(); if (post.isStarred()) { post.setStarred(false); int unstarred = ThemeHelper.getDrawableResource(getContext(), R.attr.rbn_icon_unstarred); ((ImageView)v).setImageResource(unstarred); manager.unstarPost(post.getId(), new PostUnStarResponseHandler()); } else { post.setStarred(true); int starred = ThemeHelper.getDrawableResource(getContext(), R.attr.rbn_icon_starred); ((ImageView)v).setImageResource(starred); manager.starPost(post.getId(), new PostStarResponseHandler()); } } } public void showReposters(Post post) { final ArrayList<SimpleUser> loadedUsers = new ArrayList<SimpleUser>(); for (SimpleUser u : post.getReposters()) { if (u != null) { loadedUsers.add(u); } } DialogBuilder.create(getContext()) .setTitle(R.string.reposted_by) .setAdapter(new AccountAdapter(getContext(), R.layout.user_dialog_list_item, loadedUsers), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent profileIntent = new Intent(getContext(), ProfileActivity.class); profileIntent.putExtra(Constants.EXTRA_USER_ID, loadedUsers.get(which).getId()); getContext().startActivity(profileIntent); dialog.dismiss(); } }) .setNegativeButton(R.string.close, null) .show(); } public void showStarredBy(Post post) { final ArrayList<SimpleUser> loadedUsers = new ArrayList<SimpleUser>(); for (SimpleUser u : post.getStarrers()) { if (u != null) { loadedUsers.add(u); } } DialogBuilder.create(getContext()) .setTitle(R.string.starred_by) .setAdapter(new AccountAdapter(getContext(), R.layout.user_dialog_list_item, loadedUsers), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent profileIntent = new Intent(getContext(), ProfileActivity.class); profileIntent.putExtra(Constants.EXTRA_USER_ID, loadedUsers.get(which).getId()); getContext().startActivity(profileIntent); dialog.dismiss(); } }) .setNegativeButton(R.string.close, null) .show(); } }